﻿// owner 蒋家伟

#pragma once
#include "Dbg_Warn_Define_Utils.h"

// 描述：异常信息警告，减少程序的崩溃，在运行期间更容易追踪异常。
// 作用：当认为函数的返回值或者代码的逻辑值不符合设想时进行追加与判断，对每个指针使用前都要进行空指针判断。
// 用例：QT程序：1、当异常触发时，会弹出一个框并卡在此处，如果点击 <忽略一次> 则函数结束，再次遇到这个错误会再次弹出；
//              2、如果点击 <忽略全部> 则以后遇到这个异常都会直接返回而不再弹框；
//              3、点击 <调试> 则会进入断点，通过调用堆栈找到对应的异常。
//              4、非debug(例如release)模式下并不会有弹窗，而是直接返回没有任何弹窗
//       控制台：会把异常信息输出到控制台黑框中
//
//      伪代码：
//            {
//              bool fun(){....};
//              void Test()
//              {
//                  .....
//                  bool success = fun();
//                  DBG_WARN_AND_RETURN_VOID_UNLESS(success, L"下面的逻辑依赖fun函数的返回值，如果fun返回true可以继续执行，如果fun返回false当前函数Test应该直接结束", L"蒋家伟", L"2023-07-20");
//                  .....
//              }
//            }
// 注意：使用时需要考虑当前情况是否为 "异常" ，例如合理的空指针则不需要此判断。

#ifndef UNIT_TEST_CHECK
#define UNIT_TEST_CHECK
#endif // !UNIT_TEST_CHECK


#ifndef UNIT_TEST
#define DBG_WARN(DESCRIPTION, NAME, DATE) \
        jsdk::Dbg_Warn_Define_Utils::show(__FILE__, __FUNCTION__, __LINE__, NAME, DATE, DESCRIPTION); 

#define DBG_WARN_UNLESS(CONDITION, DESCRIPTION, NAME, DATE) \
    if(!(CONDITION))\
    {\
        jsdk::Dbg_Warn_Define_Utils::showAbnormal(__FILE__, __FUNCTION__, __LINE__, NAME, DATE, DESCRIPTION);\
    }

#define DBG_WARN_AND_RETURN_UNLESS(CONDITION, RETURN_RESULT, DESCRIPTION, NAME, DATE) \
    if(!(CONDITION))\
    {\
        jsdk::Dbg_Warn_Define_Utils::showAbnormal(__FILE__, __FUNCTION__, __LINE__, NAME, DATE, DESCRIPTION);\
        return RETURN_RESULT;\
    }

#define DBG_WARN_AND_RETURN_NULLPTR_UNLESS(CONDITION, DESCRIPTION, NAME, DATE) \
    if(!(CONDITION))\
    {\
        jsdk::Dbg_Warn_Define_Utils::showAbnormal(__FILE__, __FUNCTION__, __LINE__, NAME, DATE, DESCRIPTION);\
        return nullptr;\
    }

#define DBG_WARN_AND_RETURN_FALSE_UNLESS(CONDITION, DESCRIPTION, NAME, DATE) \
    if(!(CONDITION))\
    {\
        jsdk::Dbg_Warn_Define_Utils::showAbnormal(__FILE__, __FUNCTION__, __LINE__, NAME, DATE, DESCRIPTION);\
        return false;\
    }

#define DBG_WARN_AND_RETURN_VOID_UNLESS(CONDITION, DESCRIPTION, NAME, DATE) \
    if(!(CONDITION))\
    {\
        jsdk::Dbg_Warn_Define_Utils::showAbnormal(__FILE__, __FUNCTION__, __LINE__, NAME, DATE, DESCRIPTION);\
        return;\
    }

#define DBG_WARN_AND_CONTINUE_UNLESS(CONDITION, DESCRIPTION, NAME, DATE) \
    if(!(CONDITION))\
    {\
        jsdk::Dbg_Warn_Define_Utils::showAbnormal(__FILE__, __FUNCTION__, __LINE__, NAME, DATE, DESCRIPTION);\
        continue;\
    }

#else
#include "UnitTestUtils.h"
#define DBG_WARN(DESCRIPTION, NAME, DATE) \
        jsdk::UnitTestUtils::showUnitTest(__FILE__, __FUNCTION__, __LINE__, NAME, DATE, DESCRIPTION); 

#define DBG_WARN_UNLESS(CONDITION, DESCRIPTION, NAME, DATE) \
    if(!(CONDITION))\
    {\
        jsdk::UnitTestUtils::showAbnormalUnitTest(__FILE__, __FUNCTION__, __LINE__, NAME, DATE, DESCRIPTION);\
    }

#define DBG_WARN_AND_RETURN_UNLESS(CONDITION, RETURN_RESULT, DESCRIPTION, NAME, DATE) \
    if(!(CONDITION))\
    {\
        jsdk::UnitTestUtils::showAbnormalUnitTest(__FILE__, __FUNCTION__, __LINE__, NAME, DATE, DESCRIPTION);\
        return RETURN_RESULT;\
    }

#define DBG_WARN_AND_RETURN_NULLPTR_UNLESS(CONDITION, DESCRIPTION, NAME, DATE) \
    if(!(CONDITION))\
    {\
        jsdk::UnitTestUtils::showAbnormalUnitTest(__FILE__, __FUNCTION__, __LINE__, NAME, DATE, DESCRIPTION);\
        return nullptr;\
    }

#define DBG_WARN_AND_RETURN_FALSE_UNLESS(CONDITION, DESCRIPTION, NAME, DATE) \
    if(!(CONDITION))\
    {\
        jsdk::UnitTestUtils::showAbnormalUnitTest(__FILE__, __FUNCTION__, __LINE__, NAME, DATE, DESCRIPTION);\
        return false;\
    }

#define DBG_WARN_AND_RETURN_VOID_UNLESS(CONDITION, DESCRIPTION, NAME, DATE) \
    if(!(CONDITION))\
    {\
        jsdk::UnitTestUtils::showAbnormalUnitTest(__FILE__, __FUNCTION__, __LINE__, NAME, DATE, DESCRIPTION);\
        return;\
    }

#define DBG_WARN_AND_CONTINUE_UNLESS(CONDITION, DESCRIPTION, NAME, DATE) \
    if(!(CONDITION))\
    {\
        jsdk::UnitTestUtils::showAbnormalUnitTest(__FILE__, __FUNCTION__, __LINE__, NAME, DATE, DESCRIPTION);\
        continue;\
    }
#endif
